# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


# 如果想使用管道的话那么就必须在settings中开启管道
class Scrapy04DangdangPipeline:
    # 在爬虫文件执行完之前执行的方法
    def open_spider(self, spider):
        print('+++++++++++前前前前++++++++++++++++++++++++')
        self.fp = open('book.json', 'w', encoding='utf-8')  # 1.文件操作

    # item就是yield后面的book对象
    def process_item(self, item, spider):
        """
        # 以下这种模式不推荐﹑因为每传递过来一个对象那么就打开一次文件﹑对文件的操作过于频繁

        # 保存到文件
        # (2）w模式会每一个对象都打开一次文件覆盖之前的内容
        with open('book.json', 'a', encoding='utf-8') as fp:
            # (1) write方法必须要写一个字符串而不能是其他的对象
            fp.write(str(item))

        """

        self.fp.write(str(item))  # 2.文件操作

        return item

    # 在爬虫文件执行完之后执行的方法
    def close_spider(self, spider):
        self.fp.close()  # 3.文件操作
        print('-----------后后后后后-------------------------')


import urllib.request


# 开启多条管道下载
# (1）定义管道类
# (2)在settings中开启管道   "scrapy_04_dangdang.pipelines.DangDownloadPipeline": 301,

class DangDownloadPipeline:

    def process_item(self, item, spider):
        url = 'http:' + item.get('src')

        filename = './books/' + item.get('name') + '.jpg'
        # 下载图片
        urllib.request.urlretrieve(url=url, filename=filename)

        return item
